/*
 * @Description: 添加请求和移除请求 切换路由时清除前面的请求，也可手动调用取消某个请求
 * @Author: liushuang
 * @Date: 2022-03-24 15:42:35
 * @LastEditTime: 2022-03-24 16:01:01
 */
// cancelToken.js
// 声明一个 Map 用于存储每个请求的标识 和 取消函数
import axios from 'axios'

const pending = new Map()
/**
 * @desc 添加请求
 * @param {Object} config
 */
export const addPending = (config) => {
  const url = config.url || ''
  config.cancelToken = config.cancelToken
    || new axios.CancelToken((cancel) => {
      if (!pending.has(url)) {
        // 如果 pending 中不存在当前请求，则添加进去
        pending.set(url, cancel)
      }
    })
}
/**
 * @desc 移除请求
 * @param {String | Array<string>} url
 * @param {Boolean} isCancel 是否取消请求
 */
export const removePending = (url, isCancel = false) => {
  if (typeof url === 'string') {
    if (pending.has(url)) {
    // 如果在 pending 中存在当前请求标识，需要取消当前请求，并且移除
      if (isCancel) {
        const cancel = pending.get(url)
        cancel()
      }
      pending.delete(url)
    }
  } else if (Array.isArray(url)) {
    url.forEach((item) => {
      if (pending.has(item)) {
      // 如果在 pending 中存在当前请求标识，需要取消当前请求，并且移除
        if (isCancel) {
          const cancel = pending.get(item)
          cancel()
        }
        pending.delete(item)
      }
    })
  }
}
/**
 * @desc 清空 pending 中的请求（在路由跳转时调用）
 */
export const clearPending = () => {
  pending.forEach((item) => {
    item.cancel(item.url)
  })
  pending.clear()
}
